/**
 * 跨平台URL参数处理工具
 * 兼容 H5、小程序、App 环境
 */

/**
 * 将对象转换为URL查询字符串
 * @param {Object} params - 参数对象
 * @returns {string} - 查询字符串
 */
export function objectToUrlParams(params) {
  if (!params || typeof params !== 'object') {
    return ''
  }
  
  const searchParams = []
  
  for (const [key, value] of Object.entries(params)) {
    if (value !== null && value !== undefined && value !== '') {
      // 对特殊字符进行编码
      const encodedKey = encodeURIComponent(key)
      const encodedValue = encodeURIComponent(value)
      searchParams.push(`${encodedKey}=${encodedValue}`)
    }
  }
  
  return searchParams.join('&')
}

/**
 * 将URL查询字符串转换为对象
 * @param {string} queryString - 查询字符串（可以包含或不包含'?'）
 * @returns {Object} - 参数对象
 */
export function urlParamsToObject(queryString) {
  if (!queryString || typeof queryString !== 'string') {
    return {}
  }
  
  // 移除开头的'?'如果存在
  const cleanQuery = queryString.startsWith('?') ? queryString.slice(1) : queryString
  
  if (!cleanQuery) {
    return {}
  }
  
  const params = {}
  const pairs = cleanQuery.split('&')
  
  for (const pair of pairs) {
    const [key, value] = pair.split('=')
    if (key) {
      // 解码参数
      const decodedKey = decodeURIComponent(key)
      const decodedValue = value ? decodeURIComponent(value) : ''
      params[decodedKey] = decodedValue
    }
  }
  
  return params
}

/**
 * 兼容性函数：替代URLSearchParams的toString方法
 * @param {Object} params - 参数对象
 * @returns {string} - 查询字符串
 */
export function createURLSearchParams(params) {
  return {
    toString: () => objectToUrlParams(params)
  }
}

/**
 * 合并URL和参数
 * @param {string} baseUrl - 基础URL
 * @param {Object} params - 参数对象
 * @returns {string} - 完整URL
 */
export function buildUrl(baseUrl, params) {
  if (!params || Object.keys(params).length === 0) {
    return baseUrl
  }
  
  const queryString = objectToUrlParams(params)
  if (!queryString) {
    return baseUrl
  }
  
  const separator = baseUrl.includes('?') ? '&' : '?'
  return `${baseUrl}${separator}${queryString}`
}

export default {
  objectToUrlParams,
  urlParamsToObject,
  createURLSearchParams,
  buildUrl
} 